home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / assemblr / mslang / params / ptest.asm < prev    next >
Assembly Source File  |  1993-09-30  |  3KB  |  91 lines

  1. .model small
  2.  
  3. .data
  4.    EXTERN PSPSeg: WORD
  5.    CRLF      db 13,10
  6.    no_params_msg db 'There are no parameters on the command line!',0
  7.    done_msg  db 'Program terminated normally.',0
  8.  
  9. .code
  10.  
  11.      EXTERN ParamStr   : NEAR
  12.      EXTERN ParamCount : NEAR
  13. ;*******************************************************************
  14. ;  void WriteLn( void );
  15. ;  Writes a CR/LF pair to StdOut.
  16. ;  Assumes ds points to @data. Preserves all registers
  17. ;*******************************************************************
  18. WriteLn PROC USES ax bx cx dx
  19.      mov  dx, offset CRLF
  20.      mov  cx, 2
  21.      mov  ah, 40h
  22.      mov  bx, 1
  23.      int  21h
  24.      ret
  25. WriteLn ENDP
  26.  
  27. ;*******************************************************************
  28. ;  void PrintStr( char far *lpStr );
  29. ;
  30. ;  Sends a zero-terminated string to StdOutput, followed by a CR/LF
  31. ;  Uses register calling convention: lpStr is expected in dx:ax!
  32. ;  Preserves all registers, expects ds pointing to @data.
  33. ;*******************************************************************
  34. PrintStr PROC USES ax bx cx dx 
  35.    push ds            ; save ds
  36.    mov  ds, dx        ; point ds:dx to string (pointer in dx:ax)
  37. ASSUME ds:nothing
  38.    mov  dx, ax
  39.    sub  cx, cx        ; initialize counter to zero
  40.    mov  bx, dx        ; point bx to start of string
  41.    ; determine length of string, put length into cx
  42. find_eos:             
  43.    cmp  byte ptr[bx], 0  ; end of string reached?
  44.    je   @F               ; if yes, exit loop
  45.    inc  cx               ; else inc counter
  46.    inc  bx               ; address next char
  47.    jmp  short find_eos   ; and check it
  48. @@:
  49.    ; write the determined number of charcters to StdOut (if there are any)
  50.    jcxz string_empty
  51.    mov  ah, 40h          ; DOS write to file/handle
  52.    mov  bx, 1            ; StdOut handle
  53.    int  21h              ; execute
  54. string_empty:
  55.    pop  ds               ; restore ds
  56. ASSUME ds:@data
  57.    call WriteLn          ; write a cr/lf to stdout
  58.    ret
  59. PrintStr ENDP
  60.  
  61. ;***********************MAIN**************************
  62. .STARTUP
  63.    mov  PSPSeg, es     ; save the PSP segment
  64.    ; FOR i:= 1 TO ParamCount DO BEGIN
  65.    ;    lpStr:= ParamStr( i );
  66.    ;    PrintStr( lpStr ):
  67.    ; END;
  68.    call ParamCount     ; return count of parameters in ax
  69.    mov  cx, ax         ; move it to cx
  70.    jcxz no_params
  71.    xor  ax, ax         ; use ax as index variable
  72. params_loop:
  73.    inc  ax
  74.    push ax             ; save index, ax will be destroyed by call
  75.    call ParamStr       ; return pointer to parameter in dx:ax
  76.    call PrintStr       ; print it
  77.    pop  ax             ; restore index
  78.    loop params_loop    ; loop if more parameters
  79.    jmp  done           ; jump to exit
  80.  
  81. no_params:             ; If no parameters, give a message
  82.    mov  dx, ds
  83.    mov  ax, offset no_params_msg
  84.    call PrintStr
  85. done:
  86.    mov  dx, ds         ; give a termination message
  87.    mov  ax, offset done_msg
  88.    call PrintStr
  89. .EXIT 0
  90. END
  91.